ext.define('extension.preferences', function() {

var utils = extension.utils;
var messages = extension.messages;
var data = Object.create(null);
var defaults = Object.freeze({
    'prefs.defaultmode': 0,
    'prefs.contextmenu': 1,
    'prefs.enabled': 1,
    'prefs.flashborder': 0,
    'prefs.flashquality': 0,
    'prefs.idleseconds': 0,
    'prefs.idletabs': 0,
    'prefs.optionsview': 0,
    'prefs.omniicon': 1,
    'prefs.omnialways': 1,
    'prefs.panelimage': 'icon32f.png',
    'prefs.panelcolor': [65, 65, 65, 1],
    'prefs.paneltooltip': 0,
    'prefs.panelclick': 1,
    'prefs.plugincounter': 0,
    'prefs.showicon': 1,
    'prefs.tabfocus': 0,
    'prefs.toolbar': 0,
    'prefs.toolbarposition': 0
});

function getPref(arg) {
    if (typeof arg === 'string')
        return data[arg] != null ? data[arg] : defaults[arg];
    return utils.scan(data, defaults);
}

function getChanges() {
    return utils.merge({}, data);
}

function setPref(argA, argB) {
    var p = utils.object(argA, argB), changes = {};

    for (var k in p) {
        if (k in defaults) {
            var c = {};
            if (k in data) {
                if (utils.equals(p[k], data[k]))
                    continue;
                c.oldValue = data[k];
            }
            if (p[k] == null || utils.equals(p[k], defaults[k])) {
                if (data[k] != null)
                    c.oldValue = data[k];
                delete data[k];
            }
            else
                c.newValue = data[k] = p[k];
            if ('oldValue' in c || 'newValue' in c)
                changes[k] = c;
        }
    }

    if (Object.keys(changes).length) {
        changes = utils.diff(changes, getPref());
        messages.send('change-settings', changes);
    }
}

return {
    bind: function() {
        messages.listen({
            'account-data': setPref
        });
    },
    get: getPref,
    getChanges: getChanges,
    set: setPref
};

});
